package ar.com.android.alco.forms;

import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import ar.com.android.alco.adapters.ListViewControlPesoAdapter;
import ar.com.android.alco.dbHelpers.SQLALCOHelper;
import ar.com.android.alco.entities.ControlPeso;
import ar.com.android.alco.entities.DatosUsuario;
import ar.com.android.alco.providers.ControlPesoProvider;
import ar.com.android.alco.providers.DatosUsuarioProvider;
import ar.com.android.alco.utils.Constants;

public class ControlPesoActivity extends Activity {
	private static final String TAG = "ControlPesoActivity";
	
	ListViewControlPesoAdapter listViewControlPesoAdapter;
	private List<ControlPeso> lstControlPeso = new ArrayList<ControlPeso>();
	ControlPeso selectedControlPeso;
	
	EditText edPeso;
	DatePicker dpFecha;
	ListView lvControlPeso;
	TextView tituloActivity;
	
    @Override
    public void onStart()
    {
    	super.onStart();
    }
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.control_peso);
        
        try {
        	//Busco los Objectos del Formlario
        	tituloActivity = (TextView) findViewById(R.id.txtTitulo);
        	edPeso = (EditText) findViewById(R.id.etPeso);
        	dpFecha = (DatePicker) findViewById(R.id.dpControlPeso);
        	lvControlPeso = (ListView) findViewById(R.id.lvControlPeso);
        	
            SpannableString content = new SpannableString(getString(R.string.ControlPeso));
            content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
            tituloActivity.setText(content);
        	
        	//Set Actual Date
        	Calendar c = Calendar.getInstance();
            int mYear = c.get(Calendar.YEAR);
            int mMonth = c.get(Calendar.MONTH);
            int mDay = c.get(Calendar.DAY_OF_MONTH);
            
            dpFecha.updateDate(mYear, mMonth, mDay);

    		SQLALCOHelper sqlHelper = SQLALCOHelper.getHelper(ControlPesoActivity.this);
    		sqlHelper.dbOpen();
    		ControlPesoProvider controlPesoProvider = new ControlPesoProvider(ControlPesoActivity.this);
    		
    		lstControlPeso = controlPesoProvider.getControlesPeso();
    		
    		if(lstControlPeso == null)
    			lstControlPeso = new ArrayList<ControlPeso>();
    		
    		listViewControlPesoAdapter = new ListViewControlPesoAdapter(this, R.id.lvControlPeso, lstControlPeso);
    		View header = getLayoutInflater().inflate(R.drawable.header_control_peso, null);
    		lvControlPeso.addHeaderView(header);
    		lvControlPeso.setAdapter(listViewControlPesoAdapter);

    		lvControlPeso.setOnItemClickListener(new OnItemClickListener() {

				public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
					
					for(ControlPeso controlPesoItem: lstControlPeso)
						controlPesoItem.setSelected(false);
					
					lstControlPeso.get(position - 1).setSelected(true);
					listViewControlPesoAdapter.notifyDataSetChanged();
				}
			});
    		
    		sqlHelper.dbClose();
    		
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}
    }
    
    public void OnClickCurvaPeso(View v) 
    {
		Intent intentCurvaPeso = new Intent(this, CurvaPesoActivity.class);
		startActivityForResult(intentCurvaPeso, 1);
    }
    
    public void onClickAdd(View v) {
    	
    	SQLALCOHelper sqlHelper = SQLALCOHelper.getHelper(ControlPesoActivity.this);
    	ControlPesoProvider controlPesoProvider = new ControlPesoProvider(ControlPesoActivity.this);
    	DatosUsuarioProvider datosUsuarioProvider = new DatosUsuarioProvider(ControlPesoActivity.this);
    	
    	Date selFecha = new Date(dpFecha.getYear() - 1900, dpFecha.getMonth(), dpFecha.getDayOfMonth());
    	
    	if(edPeso.getText().toString().equals("")) {
    		LayoutInflater inflater = getLayoutInflater();
			View layout = inflater.inflate(R.drawable.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

			TextView text = (TextView) layout.findViewById(R.id.text);
			text.setText(getText(R.string.msgInputPeso));

			Toast toast = new Toast(getApplicationContext());
			toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
			toast.setDuration(Toast.LENGTH_LONG);
			toast.setView(layout);
			toast.show();

			edPeso.requestFocus();
    	}
    	else if(!controlPesoProvider.validAddDate(selFecha)) {
    		LayoutInflater inflater = getLayoutInflater();
			View layout = inflater.inflate(R.drawable.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

			TextView text = (TextView) layout.findViewById(R.id.text);
			text.setText(getText(R.string.msgFechaMaxInvalida));

			Toast toast = new Toast(getApplicationContext());
			toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
			toast.setDuration(Toast.LENGTH_LONG);
			toast.setView(layout);
			toast.show();

			edPeso.requestFocus();
    	}
    	else
    	{
    		sqlHelper.dbOpen();
    		
    		try
    		{
    			DatosUsuario datosUsuario = datosUsuarioProvider.getDatosUsuario(Constants.ID_USUARIO);
    			
    			sqlHelper.beginTransaction();
    			    			
    			ControlPeso controlPeso = new ControlPeso();
    			controlPeso.setPeso(Double.parseDouble(edPeso.getText().toString()));
    			controlPeso.setFechaControl(selFecha);
    			controlPeso.setSelected(false);
    			controlPeso.setCreditosDisp(calcularCreditos(controlPeso.getPeso(), datosUsuario));
    			
    			long idControlPeso = controlPesoProvider.insertControlPeso(controlPeso);
    			
    			controlPeso.setIdControlPeso((int) idControlPeso);
    			
    			sqlHelper.commitTransaction();
    			
    			lstControlPeso.add(controlPeso);
    			listViewControlPesoAdapter.notifyDataSetChanged();
    		}
    		catch (Exception e) {
    			sqlHelper.rollbackTransaction();
				Log.e(TAG, e.toString());
			}
	    	finally {
	    		sqlHelper.dbClose();
	    	}
    	}
    }
    
    public void OnClickEdit(View v) {
    	
    	if(edPeso.getText().toString().equals("")) {
    		LayoutInflater inflater = getLayoutInflater();
			View layout = inflater.inflate(R.drawable.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

			TextView text = (TextView) layout.findViewById(R.id.text);
			text.setText(getText(R.string.msgInputPeso));

			Toast toast = new Toast(getApplicationContext());
			toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
			toast.setDuration(Toast.LENGTH_LONG);
			toast.setView(layout);
			toast.show();

			edPeso.requestFocus();
    	}
    	else
    	{
    		ControlPeso controlPesoEdit = null;
        	for(ControlPeso controlPeso: lstControlPeso)
        	{
        		if(controlPeso.getSelected()) {
        			controlPesoEdit = controlPeso;
        			break;
        		}
        	}
        	
    		SQLALCOHelper sqlHelper = SQLALCOHelper.getHelper(ControlPesoActivity.this);
    		sqlHelper.dbOpen();
    		
    		try
    		{
    			sqlHelper.beginTransaction();
    			
    			DatosUsuarioProvider datosUsuarioProvider = new DatosUsuarioProvider(ControlPesoActivity.this);
    			ControlPesoProvider controlPesoProvider = new ControlPesoProvider(ControlPesoActivity.this);
    			
    			DatosUsuario datosUsuario = datosUsuarioProvider.getDatosUsuario(Constants.ID_USUARIO);
    			
    			//Actualizo solamente el Peso y los Creditos
    			controlPesoEdit.setPeso(Double.parseDouble(edPeso.getText().toString()));
    			controlPesoEdit.setCreditosDisp(calcularCreditos(controlPesoEdit.getPeso(), datosUsuario));
    			
    			controlPesoProvider.updateControlPeso(controlPesoEdit);
    			
    			sqlHelper.commitTransaction();
    			
    			listViewControlPesoAdapter.notifyDataSetChanged();
    		}
    		catch (Exception e) {
    			sqlHelper.rollbackTransaction();
				Log.e(TAG, e.toString());
			}
	    	finally {
	    		sqlHelper.dbClose();
	    	}
    	}
    }
    
    public void OnClickDelete(View v) {
    	
    	for(ControlPeso controlPeso: lstControlPeso)
    	{
    		if(controlPeso.getSelected()) {
    			SQLALCOHelper sqlHelper = SQLALCOHelper.getHelper(ControlPesoActivity.this);
    			sqlHelper.dbOpen();
    			
		    	try
				{
		    		ControlPesoProvider controlPesoProvider = new ControlPesoProvider(ControlPesoActivity.this);
		    		controlPesoProvider.removeControlPeso(controlPeso.getIdControlPeso());
				
		    		lstControlPeso.remove(controlPeso);
		    		listViewControlPesoAdapter.notifyDataSetChanged();
					
				}
				catch (Exception e) {
					Log.e(TAG, e.toString());
				}
				finally {
					sqlHelper.dbClose();
				}
		    	break;
    		}
    	}
    }
    
    private Double calcularCreditos(Double pesoActual, DatosUsuario datosUsuario) 
    {		
    	try
		{
	    	Double creditos = 0D;
	    	
	    	if(pesoActual == 0)
	    		return 0D;

	    	if(datosUsuario == null)
	    		return 0D;
	    	
	    	if(pesoActual <= 150) {
		    	if(datosUsuario.getSexo().equals(Constants.SEXO_HOMBRES)) {
					if(datosUsuario.getFase().equals(Constants.FASE_INTENSIVA)) {
						creditos = pesoActual * 0.35;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_FLEXIBLE)) {
						creditos = pesoActual * 0.40;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_MANTENIMIENTO)) {
						creditos = pesoActual * 0.55;
					}
				}
				else if(datosUsuario.getSexo().equals(Constants.SEXO_MUJERES)) {
					if(datosUsuario.getFase().equals(Constants.FASE_INTENSIVA)) {
						creditos = pesoActual * 0.30;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_FLEXIBLE)) {
						creditos = pesoActual * 0.35;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_MANTENIMIENTO)) {
						creditos = pesoActual * 0.50;
					}
				}
				else if(datosUsuario.getSexo().equals(Constants.SEXO_NINNOS)) {
					if(datosUsuario.getFase().equals(Constants.FASE_INTENSIVA)) {
						creditos = 0D;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_FLEXIBLE)) {
						creditos = pesoActual * 0.60;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_MANTENIMIENTO)) {
						creditos = pesoActual * 0.75;
					}
				}
				else if(datosUsuario.getSexo().equals(Constants.SEXO_NINNAS)) {
					if(datosUsuario.getFase().equals(Constants.FASE_INTENSIVA)) {
						creditos = 0D;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_FLEXIBLE)) {
						creditos = pesoActual * 0.55;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_MANTENIMIENTO)) {
						creditos = pesoActual * 0.70;
					}
				}
	    	}
	    	else
	    	{
		    	if(datosUsuario.getSexo().equals(Constants.SEXO_HOMBRES)) {
					if(datosUsuario.getFase().equals(Constants.FASE_INTENSIVA)) {
						creditos = pesoActual * 0.25;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_FLEXIBLE)) {
						creditos = pesoActual * 0.30;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_MANTENIMIENTO)) {
						creditos = pesoActual * 0.55;
					}
				}
				else if(datosUsuario.getSexo().equals(Constants.SEXO_MUJERES)) {
					if(datosUsuario.getFase().equals(Constants.FASE_INTENSIVA)) {
						creditos = pesoActual * 0.20;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_FLEXIBLE)) {
						creditos = pesoActual * 0.25;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_MANTENIMIENTO)) {
						creditos = pesoActual * 0.50;
					}
				}
				else if(datosUsuario.getSexo().equals(Constants.SEXO_NINNOS)) {
					if(datosUsuario.getFase().equals(Constants.FASE_INTENSIVA)) {
						creditos = 0D;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_FLEXIBLE)) {
						creditos = pesoActual * 0.50;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_MANTENIMIENTO)) {
						creditos = pesoActual * 0.75;
					}
				}
				else if(datosUsuario.getSexo().equals(Constants.SEXO_NINNAS)) {
					if(datosUsuario.getFase().equals(Constants.FASE_INTENSIVA)) {
						creditos = 0D;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_FLEXIBLE)) {
						creditos = pesoActual * 0.45;
					}
					else if(datosUsuario.getFase().equals(Constants.FASE_MANTENIMIENTO)) {
						creditos = pesoActual * 0.70;
					}
				}
	    	}
			
	    	return Math.round(creditos*100.0)/100.0;
		}
    	catch (Exception e) {
    		return 0D;
		}
    }
}